package cn.patient.pp.module.patients.dal.dataobject.patients;

import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import cn.patient.pp.framework.mybatis.core.dataobject.BaseDO;

import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

/**
 * 随访列表 DO
 *
 * @author sailv
 */
@TableName("follow_up_list")
@KeySequence("follow_up_list_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FollowUpDO {

    /**
     * 主键
     */
    private Integer id;
    /**
     * 管理机构id
     */
    private Long deptId;
    /**
     * 姓名
     */
    private String patientName;
    /**
     * 性别
     */
    private String gender;
    /**
     * 管理地区
     */
    private String managementArea;
    /**
     * 所属机构
     */
    private String managementOrgName;
    /**
     * 患者编号
     */
    private String patientCode;
    /**
     * 证件类型
     */
    private String idNumberType;
    /**
     * 证件号码
     */
    private String idNumber;


    /**
     * 目前诊断类别
     */
    private String currentDiagnosisCategory;

    /**
     * 当前管理单位分库状态
     */
    private String currentOrgSubDbStatus;

    /**
     * 录入日期
     */
    private String entryDate;

    /**
     * 随访日期
     */
    private String followUpDate;

    /**
     * 本次随访形式
     */
    private String followUpMode;

    /**
     * 面访形式
     */
    private String faceToFaceMode;

    /**
     * 本次随访访视对象
     */
    private String followUpTarget;

    /**
     * 是否死亡
     */
    private String deceased;

    /**
     * 死亡日期
     */
    private String dateOfDeath;

    /**
     * 失访原因
     */
    private String lostContactReason;

    /**
     * 两次随访期间住院情况
     */
    private String hospitalizationStatusBetween;

    /**
     * 末次出院时间
     */
    private String lastDischargeDate;

    /**
     * 危险性评估
     */
    private String riskAssessment;

    /**
     * 目前症状有无
     */
    private String currentSymptoms;

    /**
     * 目前症状
     */
    private String currentSymptomsDetail;

    /**
     * 自知力
     */
    private String insight;

    /**
     * 睡眠
     */
    private String sleepCondition;

    /**
     * 饮食
     */
    private String eatingCondition;

    /**
     * 个人生活料理
     */
    private String selfCare;

    /**
     * 家务劳动
     */
    private String householdTasks;

    /**
     * 生产劳动及工作
     */
    private String workStatus;

    /**
     * 学习能力
     */
    private String learningAbility;

    /**
     * 社会人际交往
     */
    private String socialInteraction;

    /**
     * 危险行为有无
     */
    private String dangerousBehaviorsFlag;

    /**
     * 轻度滋事
     */
    private Integer minorNuisanceCount;

    /**
     * 肇事（次）
     */
    private Integer incidentCount;

    /**
     * 肇祸（次）
     */
    private Integer harmfulIncidentCount;

    /**
     * 其他危险行为（次）
     */
    private Integer otherDangerousBehaviorCount;

    /**
     * 自伤（次）
     */
    private Integer selfInjuryCount;

    /**
     * 自杀未遂（次）
     */
    private Integer suicideAttemptCount;

    /**
     * 两次随访期间关锁情况
     */
    private String seclusionStatus;

    /**
     * 服药依从性
     */
    private String medicationAdherence;

    /**
     * （服药依从性）不用药主要原因
     */
    private String reasonNotTakingMedication;

    /**
     * 医生姓名
     */
    private String doctor;

    /**
     * 医院
     */
    private String hospital;

    /**
     * 药物不良反应
     */
    private String adverseDrugReactions;

    /**
     * 药物不良反应类型
     */
    private String adverseDrugReactionsType;

    /**
     * 治疗效果
     */
    private String treatmentEffect;

    /**
     * 严重躯体疾病有无
     */
    private String hasSeverePhysicalDisease;

    /**
     * 严重躯体疾病请注明
     */
    private String severePhysicalDiseaseRemark;

    /**
     * 是否已转诊
     */
    private String referralFlag;

    /**
     * 建议转诊原因
     */
    private String referralReason;

    /**
     * 转诊至机构及科室
     */
    private String referralDestination;

    /**
     * 康复措施
     */
    private String rehabilitationMeasures;

    /**
     * 本次随访分类
     */
    private String currentFollowupType;

    /**
     * 是否进行个案管理
     */
    private String caseManagementFlag;

    /**
     * 应急处置
     */
    private String emergencyHandling;

    /**
     * 下次随访日期
     */
    private String nextFollowUpDate;

    /**
     * 记录纸
     */
    private String recordSheet;


    /**
     * 年龄
     */
    @TableField(exist = false)
    private Integer age;


    /**
     * 设置身份证号，并自动解析出生日期与性别
     */
    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
        this.age = null;

        if (idNumber == null) {
            return;
        }

        String birthStr;

        if (idNumber.length() == 18) {
            // 18 位身份证：出生日期位 7–14（yyyyMMdd），性别码第 17 位（索引 16）
            birthStr     = idNumber.substring(6, 14);
        }
        else if (idNumber.length() == 15) {
            // 15 位身份证：出生日期位 7–12（yyMMdd），需要补 “19” 前缀；性别码第 15 位（索引 14）
            birthStr     = "19" + idNumber.substring(6, 12);
        }
        else {
            // 既不是 15 位也不是 18 位，不能解析
            return;
        }

        try {
            // 1. 解析出生日期
            LocalDate birthDate = LocalDate.parse(
                    birthStr,
                    DateTimeFormatter.ofPattern("yyyyMMdd")
            );
            // 计算年龄
            this.age = Period.between(birthDate, LocalDate.now()).getYears();
        } catch (DateTimeParseException e) {
            // 解析失败则保留 null
            this.age    = null;
        }
    }
}